package com.xuzimian.global.demo.spring.security.oauth2.client.config;

import org.springframework.security.oauth2.client.filter.OAuth2ClientContextFilter;
import org.springframework.web.context.request.RequestContextListener;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

import javax.servlet.Filter;
import javax.servlet.FilterRegistration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;


public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

  /**
   * 根容器:返回的配置类定义了Spring应用根容器中的beans
   * 注意：上面配置的ComponentScan 会在spring 根容器中。但是不会将扫描到的controller 等springmvc 组件
   * @return
   */
  @Override
  protected Class<?>[] getRootConfigClasses() {
    return new Class<?>[] { RootConfig.class };
  }

  /**
   * Spring mvc容器:返回的配置类定义了Spring MVC应用容器中的beans
   *  注意：上面配置的ComponentScan 会在spring mvc 容器中，这里配置扫描 spring mvc 相关的组件，如Controller
   * @return
   */
  @Override
  protected Class<?>[] getServletConfigClasses() {
    return new Class<?>[] { WebMvcConfig.class };
  }

  /**
   * DispatcherServlet映射,从"/"开始
   * @return
   */
  @Override
  protected String[] getServletMappings() {
    return new String[] { "/" };
  }

  @Override
  protected Filter[] getServletFilters() {
   return super.getServletFilters();
  }


  /**
   * 为了使用Bean scope = request 和 session，需要注册RequestContextListener 监听器。
   * 以下是javaconfig方式，还可以在web.xml中配置。而Spring-boot 在WebMvcAutoConfiguration
   * 类中进行了自动配置，所以无需配置。
   * @param servletContext
   */
  @Override
  protected void registerContextLoaderListener(ServletContext servletContext) {
    super.registerContextLoaderListener(servletContext);
    servletContext.addListener(new RequestContextListener());
  }

  @Override
  public void onStartup(ServletContext servletContext) throws ServletException {
    super.onStartup(servletContext);
  }
}